package com.zenithmind.mall.service;

import com.zenithmind.common.result.PageResult;
import com.zenithmind.mall.pojo.dto.SeckillOrderDTO;
import com.zenithmind.mall.pojo.query.SeckillOrderQuery;
import com.zenithmind.mall.pojo.vo.SeckillOrderVO;

import java.util.List;

/**
 * 秒杀订单服务接口 - 遵循接口隔离原则，专门负责秒杀订单管理
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
public interface SeckillOrderService {

    /**
     * 分页查询秒杀订单
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<SeckillOrderVO> getSeckillOrderPage(SeckillOrderQuery query);

    /**
     * 根据ID获取秒杀订单详情
     * 
     * @param id 秒杀订单ID
     * @param userId 用户ID（用于权限验证）
     * @return 订单详情
     */
    SeckillOrderVO getSeckillOrderById(String id, String userId);

    /**
     * 根据订单号获取秒杀订单详情
     * 
     * @param orderNo 订单号
     * @param userId 用户ID（用于权限验证）
     * @return 订单详情
     */
    SeckillOrderVO getSeckillOrderByNo(String orderNo, String userId);

    /**
     * 创建秒杀订单
     * 
     * @param seckillOrderDTO 秒杀订单信息
     * @param userId 用户ID
     * @return 秒杀订单ID
     */
    String createSeckillOrder(SeckillOrderDTO seckillOrderDTO, String userId);

    /**
     * 支付秒杀订单
     * 
     * @param id 秒杀订单ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean paySeckillOrder(String id, String userId);

    /**
     * 取消秒杀订单
     * 
     * @param id 秒杀订单ID
     * @param reason 取消原因
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean cancelSeckillOrder(String id, String reason, String userId);

    /**
     * 检查秒杀订单是否可以支付
     * 
     * @param id 秒杀订单ID
     * @param userId 用户ID
     * @return 是否可以支付
     */
    Boolean canPaySeckillOrder(String id, String userId);

    /**
     * 检查秒杀订单是否可以取消
     * 
     * @param id 秒杀订单ID
     * @param userId 用户ID
     * @return 是否可以取消
     */
    Boolean canCancelSeckillOrder(String id, String userId);

    /**
     * 获取用户秒杀订单列表
     * 
     * @param userId 用户ID
     * @param status 订单状态
     * @return 秒杀订单列表
     */
    List<SeckillOrderVO> getUserSeckillOrders(String userId, Integer status);

    /**
     * 获取用户秒杀订单统计
     * 
     * @param userId 用户ID
     * @return 订单统计
     */
    Object getUserSeckillOrderStatistics(String userId);

    /**
     * 处理超时未支付的秒杀订单
     * 
     * @return 处理数量
     */
    Integer handleTimeoutSeckillOrders();

    /**
     * 转换秒杀订单为正式订单
     * 
     * @param seckillOrderId 秒杀订单ID
     * @return 正式订单ID
     */
    String convertToOrder(String seckillOrderId);

    /**
     * 批量转换秒杀订单为正式订单
     * 
     * @param seckillOrderIds 秒杀订单ID列表
     * @return 转换结果
     */
    Boolean batchConvertToOrders(List<String> seckillOrderIds);

    /**
     * 获取秒杀订单支付剩余时间
     * 
     * @param id 秒杀订单ID
     * @return 剩余时间（秒）
     */
    Long getPaymentRemainingTime(String id);

    /**
     * 验证秒杀订单合法性
     * 
     * @param seckillOrderDTO 秒杀订单信息
     * @param userId 用户ID
     * @return 验证结果
     */
    Boolean validateSeckillOrder(SeckillOrderDTO seckillOrderDTO, String userId);
}
